﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using BLL.BusinessClasses;

namespace WebSite.Egresado
{
    public partial class Perfil : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.Session["UsuarioDeSesion"] == null || !(this.Session["UsuarioDeSesion"] is UsuarioUniversitario))
            {
                this.Response.Redirect(@"~/General/Principal.aspx");
                return;
            }
            if (!(this.Page.IsPostBack))
            {
                this.DarBienvenida();
            }           
        }

        protected void Esconder_ContenidoPagina()
        {
            if (this.Panel_DatosGenerales.Visible)
            {
                this.Panel_DatosGenerales.Visible = false; ;
                this.Button_MostrarPanelDatosGenerales.Text = "▼";
            }

            if (this.Panel_Habilidades.Visible)
            {
                this.Panel_Habilidades.Visible = false; ;
                this.Button_MostrarPanelHabilidades.Text = "▼";
            }

            if (this.Panel_Contactos.Visible)
            {
                this.Panel_Contactos.Visible = false;
                this.Button_MostrarPanelContactos.Text = "▼";
            }

            if (this.Panel_Password.Visible)
            {
                this.Panel_Password.Visible = false;
                this.Button_MostrarPanelPassword.Text = "▼";
            }

            if (this.Panel_Ficha.Visible)
            {
                this.Panel_Ficha.Visible = false;
                this.Button_MostrarPanelFicha.Text = "▼";
            }
        }

        // Show/Hide Event Handlers 
        protected void Button_MostrarPanelDatosGenerales_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();

            this.Panel_DatosGenerales.Visible = !(this.Panel_DatosGenerales.Visible);

            if (this.Panel_DatosGenerales.Visible)
            {
                this.PoblarCampos_Panel_DatosGenerales();
                this.Button_MostrarPanelDatosGenerales.Text = "▲";
            }
            else this.Button_MostrarPanelDatosGenerales.Text = "▼";
        }

        protected void Button_MostrarPanelHabilidades_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();

            this.Panel_Habilidades.Visible = !(this.Panel_Habilidades.Visible);

            if (this.Panel_Habilidades.Visible)
            {
                this.PoblarCampos_Panel_Habilidades();
                this.Button_MostrarPanelHabilidades.Text = "▲";
            }
            else this.Button_MostrarPanelHabilidades.Text = "▼";
        }

        protected void Button_MostrarPanelContactos_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();

            this.Panel_Contactos.Visible = !(this.Panel_Contactos.Visible);

            if (this.Panel_Contactos.Visible)
            {
                this.PoblarCampos_Panel_Contactos();
                this.Button_MostrarPanelContactos.Text = "▲";
            }
            else this.Button_MostrarPanelContactos.Text = "▼";
        }

        protected void Button_MostrarPanelPassword_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();

            this.Panel_Password.Visible = !(this.Panel_Password.Visible);
            
            if (this.Panel_Password.Visible)
            {
                this.Button_MostrarPanelPassword.Text = "▲";
            }
            else this.Button_MostrarPanelPassword.Text = "▼";
           
        }

        protected void Button_MostrarPanelFicha_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_Ficha.Visible = !(this.Panel_Ficha.Visible);

            if (this.Panel_Ficha.Visible)
            {
                this.Button_MostrarPanelFicha.Text = "▲";                
            }
            else this.Button_MostrarPanelFicha.Text = "▼";
        }

        // PoblarCampos Methods       
        private void PoblarCampos_Panel_DatosGenerales()
        {
            if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Foto != null)
            {
                this.Image_Foto.ImageUrl = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Foto;
            }
            else
            {
                if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Sexo.Trim() == "M")
                    this.Image_Foto.ImageUrl = "~\\Pictures\\UserPictures\\DefaultMUserPic.png";
                else if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Sexo.Trim() == "F")
                    this.Image_Foto.ImageUrl = "~\\Pictures\\UserPictures\\DefaultFUserPic.png";
            }

            this.TextBox_Nombre.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).NombreCompleto;
            this.TextBox_Edad.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Edad.ToString();
            this.TextBox_Sexo.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Sexo;
            this.TextBox_ExpLaboral.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AñosDeExperienciaLaboral.ToString();
            this.TextBox_DetalleExperiencia.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).DetalleExperienciaLaboral;
            this.TextBox_Intereses.Text = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Intereses;

            this.CheckBox_TieneVehiculo.Checked = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiVehiculoPropio;
            this.CheckBox_TiempoCompleto.Checked = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiBuscaTiempoCompleto;

            this.DropDownList_Estado.SelectedValue = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Estado.Trim();

            //Poblar el ListBox de carreras y de postgrados
            if (this.Session["UsuarioDeSesion"] is UsuarioEgresado)
            {
                this.ListBox_Carreras.DataSource = from c in ((UsuarioEgresado)this.Session["UsuarioDeSesion"]).Carreras
                                                   select c;

                this.ListBox_Carreras.DataTextField = "Descripcion";
                this.ListBox_Carreras.DataValueField = "ID";

                this.ListBox_Carreras.DataBind();

                this.ListBox_Postgrados.DataSource = from p in ((UsuarioEgresado)this.Session["UsuarioDeSesion"]).Postgrados
                                                     select p;

                this.ListBox_Postgrados.DataTextField = "Descripcion";
                this.ListBox_Postgrados.DataValueField = "ID";

                this.ListBox_Postgrados.DataBind();
            }
            else if (this.Session["UsuarioDeSesion"] is UsuarioEstudiante) 
            {
                this.ListBox_Carreras.Items.Clear();
                this.ListBox_Carreras.Items.Add(new ListItem(((UsuarioEstudiante)this.Session["UsuarioDeSesion"]).Carrera.Descripcion, 
                                                             ((UsuarioEstudiante)this.Session["UsuarioDeSesion"]).Carrera.ID.ToString()));

                this.Label_DatosGeneralesCarrera.Text = "Carera:";
                this.TR_Postgrados.Visible = false;                
            }
        }
        private void PoblarCampos_Panel_Habilidades()
        {
            //this.ListBox_Habilidades.Items.Clear();
            //foreach (Habilidad item in ((UsuarioEgresado)this.Session["UsuarioDeSesion"]).Habilidades)
            //{
            //    this.ListBox_Habilidades.Items.Add(new ListItem(item.Descripcion, item.ID.ToString()));
            //}

            this.ListBox_Habilidades.DataSource = from h in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Habilidades
                                                  select h;

            this.ListBox_Habilidades.DataTextField = "Descripcion";
            this.ListBox_Habilidades.DataValueField = "ID";

            this.ListBox_Habilidades.DataBind();
        }
        private void PoblarCampos_Panel_Contactos()
        {
            //var u = this.Session["UsuarioDeSesion"] as UsuarioEgresado;

            var EMail = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                        where c.TipoContacto.Trim() == "Email"
                        select c;

            var TelefonoMovil = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                                where c.TipoContacto.Trim() == "Celular"
                                select c;

            var TelefonoResidencial = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                                      where c.TipoContacto.Trim() == "Telefono"
                                      select c;

            if (EMail.Count() != 0)
            {
                this.TextBox_EMail.Text = EMail.First().Descripcion;
            }

            if (TelefonoMovil.Count() != 0)
            {
                this.TextBox_TelefonoMovil.Text = TelefonoMovil.First().Descripcion;
                //this.TextBox_Movil_3.Text = TelefonoMovil.First().Descripcion.Split('-')[2];
                //this.TextBox_Movil_4.Text = TelefonoMovil.First().Descripcion.Split('-')[3];
            }

            if (TelefonoResidencial.Count() != 0)
            {
                this.TextBox_TelefonoResidencial.Text = TelefonoResidencial.First().Descripcion;
                //this.TextBox_Residencial_2.Text = TelefonoResidencial.First().Descripcion.Split('-')[1];
                //this.TextBox_Residencial_3.Text = TelefonoResidencial.First().Descripcion.Split('-')[2];
            }
        }

        // Button_Click Event Handlers
        protected void Button_LogOff_Click(object sender, EventArgs e)
        {
            this.Session["UsuarioDeSesion"] = null;

            this.Response.Redirect(@"~/General/Principal.aspx");
        }
        protected void Button_ModificarDatosGenerales_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AñosDeExperienciaLaboral = Convert.ToInt32(this.TextBox_ExpLaboral.Text);
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).DetalleExperienciaLaboral = this.TextBox_DetalleExperiencia.Text;
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Intereses = this.TextBox_Intereses.Text;

                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiVehiculoPropio = this.CheckBox_TieneVehiculo.Checked;
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiBuscaTiempoCompleto = this.CheckBox_TiempoCompleto.Checked;

                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Estado = this.DropDownList_Estado.SelectedValue;

                this.UploadFoto();

                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Actualizar();

                this.PoblarCampos_Panel_DatosGenerales();
            }
            catch
            {
                this.Label_MensajeErrorDatosGenerales.Visible = true;
            }
        }
        protected void Button_AgregarHabilidad_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AgregarHabilidad(Convert.ToInt32(this.DropDownList_Habilidades.SelectedValue));
            }
            catch (Exception)
            {
                this.Label_MensajeErrorHabilidadExistente.Visible = true;
            }

            this.PoblarCampos_Panel_Habilidades();
        }
        protected void Button_EliminarHabilidad_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).EliminarHabilidad(Convert.ToInt32(this.ListBox_Habilidades.SelectedValue));
            }
            catch (Exception)
            {
                this.Label_MensajeErrorHabilidadEliminar.Visible = true;
            }

            this.PoblarCampos_Panel_Habilidades();
        }
        protected void Button_NuevaHabilidad_Click(object sender, EventArgs e)
        {
            if (this.TextBox_NuevaHabilidad.Text != String.Empty)
            {
                try
                {
                    new Habilidad(this.TextBox_NuevaHabilidad.Text.Trim()).Insertar();
                    this.TextBox_NuevaHabilidad.Text = String.Empty;

                    this.DropDownList_Habilidades.Items.Clear();
                    this.DropDownList_Habilidades.Items.Add(new ListItem("[Seleccione una habilidad]", "0"));
                    this.DropDownList_Habilidades.DataBind();
                }
                catch (Exception)
                {
                    this.Label_MensajeErrorNuevaHabilidad.Visible = true;
                }
            }
        }
        protected void Button_ModificarContactos_Click(object sender, EventArgs e)
        {
            var EMail = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                        where c.TipoContacto.Trim() == "Email"
                        select c;

            var TelefonoMovil = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                                where c.TipoContacto.Trim() == "Celular"
                                select c;

            var TelefonoResidencial = from c in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Contactos
                                      where c.TipoContacto.Trim() == "Telefono"
                                      select c;

            if (EMail.Count() == 0)
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AgregarContacto("Email", this.TextBox_EMail.Text);
            }
            else
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).ModificarContacto(EMail.First().ID, this.TextBox_EMail.Text);
            }

            if (TelefonoMovil.Count() == 0)
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AgregarContacto("Celular",
                                                                                   this.TextBox_TelefonoMovil.Text);
            }
            else
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).ModificarContacto(TelefonoMovil.First().ID,
                                                                                     this.TextBox_TelefonoMovil.Text);
            }

            if (TelefonoResidencial.Count() == 0)
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).AgregarContacto("Telefono",
                                                                                   this.TextBox_TelefonoResidencial.Text);
            }
            else
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).ModificarContacto(TelefonoResidencial.First().ID,
                                                                                     this.TextBox_TelefonoResidencial.Text);
            }
        }
        protected void Button_CambiarPassword_Click(object sender, EventArgs e)
        {
            if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).PassWord == Encryption.GetMD5Hash(this.TextBox_PWActual.Text.Trim()))
            {
                ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).CambiarPassWord(Encryption.GetMD5Hash(this.TextBox_PWNuevo.Text.Trim()));
            }
            else
            {
                this.Label_ErrorPWIncorrecto.Visible = true;
                this.Label_SummaryErrorPWIncorrecto.Visible = true;
            }
        }

        // Helper Methods 
        private void DarBienvenida()
        {
            ((Label)(this.Master.FindControl("Label_Bienvenida"))).Text = "Bienvenido <u>" +
                                                                          ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).PrimerNombre + " " +
                                                                          ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).PrimerApellido + "</u>";
        }
        private void UploadFoto()
        {
            string SavePath = Request.PhysicalApplicationPath + ConfigurationSettings.AppSettings["UserPictureUploadPath"] + ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Matricula + ".png";

            try
            {
                if (this.FileUpload_UploadFoto.HasFile)
                {
                    if (this.FileUpload_UploadFoto.FileName.EndsWith(".png") || this.FileUpload_UploadFoto.FileName.EndsWith(".jpg") || this.FileUpload_UploadFoto.FileName.EndsWith(".bmp"))
                    {
                        if (this.FileUpload_UploadFoto.PostedFile.ContentLength < 1048576)
                        {
                            FileUpload_UploadFoto.SaveAs(SavePath);
                        }
                        else
                        {
                            this.Label_UploadStatus.Text = "No se ha podido subir la foto. Exede el limite de 1 MB.";
                            this.Label_UploadStatus.Visible = true;
                            return;
                        }
                    }
                    else
                    {
                        this.Label_UploadStatus.Text = "No se ha podido subir la foto. Formato no soportado.";
                        this.Label_UploadStatus.Visible = true;
                        return;
                    }

                    ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Foto = "~" + ConfigurationSettings.AppSettings["UserPictureUploadPath"] + ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Matricula + ".png";
                }

            }
            catch
            {
                this.Label_UploadStatus.Text = "No se ha podido subir la foto. Intente luego.";
            }
        }

        protected void ListBox_Habilidades_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.Button_EliminarHabilidad.Enabled = true;
        }
        protected void DropDownList_Habilidades_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.DropDownList_Habilidades.SelectedValue != "0")
            {
                this.Button_AgregarHabilidad.Enabled = true;
            }
            else 
            {
                this.Button_AgregarHabilidad.Enabled = false;
            }
        }
        protected void TextBox_NuevaHabilidad_TextChanged(object sender, EventArgs e)
        {
            if (this.TextBox_NuevaHabilidad.Text.Trim() != String.Empty)
            {
                this.Button_NuevaHabilidad.Enabled = true;
            }
            else
            {
                this.Button_NuevaHabilidad.Enabled = false;
            }    
        }       
        protected void GridView_SummaryDatos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ListBox SummaryListBox;

                if (this.Session["UsuarioDeSesion"] is UsuarioEgresado)
                {
                    SummaryListBox = ((ListBox)e.Row.FindControl("ListBox_SummaryCarreras"));
                    SummaryListBox.DataSource = from c in ((UsuarioEgresado)this.Session["UsuarioDeSesion"]).Carreras
                                                select c;
                    SummaryListBox.DataTextField = "Descripcion";
                    SummaryListBox.DataValueField = "ID";
                    SummaryListBox.DataBind();

                    SummaryListBox = ((ListBox)e.Row.FindControl("ListBox_SummaryPostgrados"));
                    SummaryListBox.DataSource = from p in ((UsuarioEgresado)this.Session["UsuarioDeSesion"]).Postgrados
                                                select p;
                    SummaryListBox.DataTextField = "Descripcion";
                    SummaryListBox.DataValueField = "ID";
                    SummaryListBox.DataBind();
                }
                else if (this.Session["UsuarioDeSesion"] is UsuarioEstudiante) 
                {
                    SummaryListBox = ((ListBox)e.Row.FindControl("ListBox_SummaryCarreras"));
                    SummaryListBox.Items.Clear();
                    SummaryListBox.Items.Add(new ListItem(((UsuarioEstudiante)this.Session["UsuarioDeSesion"]).Carrera.Descripcion,
                                                          ((UsuarioEstudiante)this.Session["UsuarioDeSesion"]).Carrera.ID.ToString()));

                    ((Label)e.Row.FindControl("Label_SummaryCarreras")).Text = "Carrera";
                    e.Row.FindControl("DIV_SummaryPostgrados").Visible = false;
                }

                SummaryListBox = ((ListBox)e.Row.FindControl("ListBox_SummaryHabilidades"));
                SummaryListBox.DataSource = from h in ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Habilidades
                                            select h;
                SummaryListBox.DataTextField = "Descripcion";
                SummaryListBox.DataValueField = "ID";
                SummaryListBox.DataBind();

                switch (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiVehiculoPropio)
                {
                    case true:
                        ((TextBox)e.Row.FindControl("TextBox_SummaryVehiculoPropio")).Text = "Si";
                        break;
                    case false:
                        ((TextBox)e.Row.FindControl("TextBox_SummaryVehiculoPropio")).Text = "No";
                        break;
                }

                switch (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).SiBuscaTiempoCompleto)
                {
                    case true:
                        ((TextBox)e.Row.FindControl("TextBox_SummaryTiempoCompleto")).Text = "Si";
                        break;
                    case false:
                        ((TextBox)e.Row.FindControl("TextBox_SummaryTiempoCompleto")).Text = "No";
                        break;
                }

                if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Foto != null)
                {
                    ((Image)e.Row.FindControl("Image_SummaryFoto")).ImageUrl = ((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Foto;
                }
                else
                {
                    if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Sexo.Trim() == "M")
                        ((Image)e.Row.FindControl("Image_SummaryFoto")).ImageUrl = "~\\Pictures\\UserPictures\\DefaultMUserPic.png";
                    else if (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Sexo.Trim() == "F")
                        ((Image)e.Row.FindControl("Image_SummaryFoto")).ImageUrl = "~\\Pictures\\UserPictures\\DefaultFUserPic.png";
                }

                switch (((UsuarioUniversitario)this.Session["UsuarioDeSesion"]).Estado.Trim())
                {
                    case "Activo":
                        ((Label)e.Row.FindControl("Label_SummaryEstado")).Text = "Empleado";
                        break;
                    case "Inactivo":
                        ((Label)e.Row.FindControl("Label_SummaryEstado")).Text = "Desempleado";
                        break;
                    case "Incognito":
                        ((Label)e.Row.FindControl("Label_SummaryEstado")).Text = "No Especificado";
                        break;
                } 
            }            
        }
        protected void ObjectDataSource_Summary_Init(object sender, EventArgs e)
        {
            if (this.Session["UsuarioDeSesion"] is UsuarioEgresado)
            {
                this.ObjectDataSource_Summary.TypeName = "BLL.BusinessClasses.UsuarioEgresado";
                this.ObjectDataSource_Summary.SelectMethod = "GetEgresadoByID";
            }
            else if (this.Session["UsuarioDeSesion"] is UsuarioEstudiante)
            {
                this.ObjectDataSource_Summary.TypeName = "BLL.BusinessClasses.UsuarioEstudiante";
                this.ObjectDataSource_Summary.SelectMethod = "GetEstudianteByID";
            }
        }
    }
}